package com.cq.androidtools.jetpack.hilt
//
import android.util.Log
import dagger.Binds
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.components.ActivityComponent
import retrofit2.Retrofit
import javax.inject.Inject

/**
 * 作者: CQ
 * 日期: 2021-06-29
 * 说明: 使用 @Binds 注入接口实例
 */
class AnalyticsAdapter @Inject constructor(
     val service: AnalyticsService
)


interface AnalyticsService {
    fun analyticsMethods()
}


class AnalyticsServiceImpl @Inject constructor() : AnalyticsService {
    override fun analyticsMethods() {
        Log.e("AnalyticsServiceImpl", "analyticsMethods")
    }
}

// 使用 @Binds 注入接口实例
@Module
@InstallIn(ActivityComponent::class)
abstract class AnalyticsModule {
    @Binds
    abstract fun bindAnalyticsService(analyticsServiceImpl: AnalyticsServiceImpl) : AnalyticsService

}

// 使用 @Provides 注入实例
//接口不是无法通过构造函数注入类型的唯一一种情况。如果某个类不归您所有（因为它来自外部库，如 Retrofit、OkHttpClient 或 Room 数据库等类），
// 或者必须使用构建器模式创建实例，也无法通过构造函数注入
// 带有注释的函数会向 Hilt 提供以下信息：
//
//函数返回类型会告知 Hilt 函数提供哪个类型的实例。
//函数参数会告知 Hilt 相应类型的依赖项。
//函数主体会告知 Hilt 如何提供相应类型的实例。每当需要提供该类型的实例时，Hilt 都会执行函数主体。
@Module
@InstallIn(ActivityComponent::class)
object AnalyticsModule1 {

    @Provides
    fun provideAnalyticsService(
        // Potential dependencies of this type
    ): AnalyticsService {
        return Retrofit.Builder()
            .baseUrl("https://example.com")
            .build()
            .create(AnalyticsService::class.java)
    }
}



